home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1996 May: Tool Chest / Developer CD Series May 1996 (Tool Chest) (Apple Computer) (1996).iso / Sample Code / Snippets / Devices / Floppy II / FloppytestII.c next >
Encoding:
C/C++ Source or Header  |  1995-02-07  |  3.8 KB  |  150 lines  |  [TEXT/MPS ]

  1. #include    <Events.h>
  2. #include    <Devices.h>
  3. #include    <Memory.h>
  4. #include    <Types.h>
  5. #include    <StdIO.h>
  6. #include    <TextUtils.h>
  7.  
  8. #define kHandleBased        0x0040    
  9. #define UnitToRef(unitNo)        ( -(unitNo) - 1 )
  10.  
  11. #define LMGetUnitNtryCnt() (* (short *) 0x1D2) 
  12.  
  13.  
  14. typedef struct
  15. {
  16.     short        drvrFlags;        /* dReadEnable, etc */
  17.     short        drvrDelay;        /* for periodic actions via SystemTask */
  18.     short        drvrEMask;        /* for desk acc only */
  19.     short        drvrMenu;        /* for desk acc only */
  20.     short        drvrOpen;        /* offset to open routine */
  21.     short        drvrPrime;        /* offset to prime routine */
  22.     short        drvrCtl;        /* offset to control routine */
  23.     short        drvrStatus;        /* offset to status routine */
  24.     short        drvrClose;        /* offset to close routine */
  25.     unsigned char drvrName[];    /* Pascal string */
  26. } DriverHeader;
  27.  
  28. typedef struct
  29. {
  30.     long        diskCapInBlocks;
  31.     char        numSides;
  32.     char        numSectors;
  33.     short        numTracks;
  34. } formatblock;
  35.  
  36. short FindDriverByName( void *pString )
  37. {
  38.     short            refNo;
  39.     Byte            oldDriverFlags;
  40.     DCtlHandle        driverInfo;
  41.     DriverHeader    *driverPtr, **driverHandle;
  42.     short            unitNumber;
  43.     short            numEntriesInTable;
  44.     
  45.     numEntriesInTable = LMGetUnitNtryCnt();
  46.     
  47.     for ( unitNumber=0; unitNumber<numEntriesInTable; unitNumber++ ) {
  48.         refNo = UnitToRef(unitNumber);
  49.         driverInfo = GetDCtlEntry(refNo);
  50.         if (driverInfo) {
  51.             if ((**driverInfo).dCtlFlags & kHandleBased ) {
  52.                 driverHandle = (void *)(**driverInfo).dCtlDriver;
  53.                 if (!driverHandle || !(*driverHandle))
  54.                     continue;
  55.                     
  56.                 oldDriverFlags = HGetState((Handle) driverHandle);
  57.                 HLock((Handle)driverHandle);
  58.                 
  59.                 if (EqualString(pString, (**driverHandle).drvrName, false, true)) {
  60.                     HSetState((Handle)driverHandle, oldDriverFlags);
  61.                     return(refNo);
  62.                     }
  63.                 
  64.                 HSetState((Handle)driverHandle, oldDriverFlags);
  65.                 }
  66.                 else {
  67.                 driverPtr = (void*)(**driverInfo).dCtlDriver;
  68.                 if ( !driverPtr ) 
  69.                     continue;
  70.                     
  71.                 if ( EqualString( pString, driverPtr->drvrName, false, true ) )
  72.                     return( refNo );
  73.                 }
  74.             }
  75.         }
  76.     
  77.     return(0);
  78. }
  79.  
  80. void main()
  81. {
  82.     ParmBlkPtr        pBlockPtr;
  83.     OSErr            err;
  84.     short            refNum;
  85.     formatblock        formatList[40];
  86.     short            i;
  87.     Boolean            Cap, TSSData, numSide, numSec, numTrak, SD;
  88.     long            address;
  89.     
  90.     refNum = FindDriverByName("\p.Sony");
  91.     
  92.     pBlockPtr = (ParmBlkPtr) NewPtrClear (sizeof (ParamBlockRec));
  93.     if (MemError() != noErr)
  94.         Debugger();
  95.         
  96.     pBlockPtr->cntrlParam.ioCompletion = nil;
  97.     pBlockPtr->cntrlParam.ioResult = 0;
  98.     pBlockPtr->cntrlParam.ioVRefNum = 1;
  99.     pBlockPtr->cntrlParam.ioCRefNum = refNum;
  100.     pBlockPtr->cntrlParam.csCode = 6;
  101.     pBlockPtr->cntrlParam.csParam[0] = 5;
  102.     address = &formatList;
  103.     pBlockPtr->cntrlParam.csParam[1] = (address >> 16);
  104.     pBlockPtr->cntrlParam.csParam[2] = &formatList;
  105.     
  106.     err = PBStatus (pBlockPtr, false);
  107.     if (err != noErr)
  108.         DebugStr("\perror in PBStatus");
  109.         
  110.     for (i = 0; i <= pBlockPtr->cntrlParam.csParam[0]; ++i) {
  111.         Cap = (formatList[i].diskCapInBlocks == 1440);
  112.         TSSData = ((formatList[i].numSides & 0x80) >> 4);
  113.         SD = ((formatList[i].numSides & 0x10) == 0);
  114.         numSide = ((formatList[i].numSides & 0xF) == 2);
  115.         numSec = (formatList[i].numSectors == 9);
  116.         numTrak = (formatList[i].numTracks == 80);
  117.         
  118.         if (Cap && TSSData && SD && numSide && numSec && numTrak) {
  119.             printf ("the index I want is %i\n", i);
  120.             break;
  121.             }
  122.         if (i == pBlockPtr->cntrlParam.csParam[0])
  123.             printf ("No Such Drive Format at index %i\n", i++);
  124.         }
  125.         
  126.     DisposPtr ((Ptr) pBlockPtr);
  127.     
  128.     if (i <= pBlockPtr->cntrlParam.csParam[0]) {
  129.         
  130.         pBlockPtr = (ParmBlkPtr) NewPtrClear (sizeof (ParamBlockRec));
  131.         if (MemError() != noErr)
  132.             Debugger();
  133.  
  134.         pBlockPtr->cntrlParam.ioCompletion = nil;
  135.         pBlockPtr->cntrlParam.ioResult = 0;
  136.         pBlockPtr->cntrlParam.ioVRefNum = 1;
  137.         pBlockPtr->cntrlParam.ioCRefNum = refNum;
  138.         pBlockPtr->cntrlParam.csCode = 6;
  139.         pBlockPtr->cntrlParam.csParam[0] = i;
  140.     
  141.         err = PBControl (pBlockPtr, false);
  142.         if (err != noErr)
  143.             DebugStr("\perror in PBControl");
  144.         
  145.         DisposPtr ((Ptr) pBlockPtr);
  146.         }
  147.  
  148.     return;
  149. }
  150.